package cn.edu.scau.cmi.chenbingquan.client;     

import java.util.ArrayList;
import java.util.function.Consumer;
import cn.edu.scau.cmi.chenbingquan.composite.consistent.ConsistentComponent;
import cn.edu.scau.cmi.chenbingquan.composite.consistent.ConsistentComposite;
import cn.edu.scau.cmi.chenbingquan.composite.consistent.ConsistentLeaf;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.text.Text;
import javafx.scene.paint.Color;

// 一致组合模式的客户类
public class ConsistentCompositeClient extends Application { 
	private Pane root = new Pane();
	private TreeView<ConsistentComponent> tree = new TreeView<>();	// 树形视图
	private VBox vBox = new VBox(50);	// 竖直面板(放置按钮)
	private Button addPersonButton;		// 增加个人按钮
	private Button addTeamButton;		// 增加团队按钮
	private Button delNodeButton;		// 删除按钮
	private ArrayList<String> names = new ArrayList<>(); 	// 存储节点的名字(用于判断名字是否重复)
	
	public static void main(String[] args) {
		launch(args);
	}
	
	@Override
	public void start(Stage stage) {
		
		root.setStyle("-fx-background-color: linear-gradient(to bottom right, ANTIQUEWHITE, CORNFLOWERBLUE)");
		
		// 树形视图
		tree.setFixedCellSize(25);
		tree.setLayoutX(40);
		tree.setLayoutY(30);
		
		ConsistentComposite rootTeam = new ConsistentComposite("总团队");
		TreeItem<ConsistentComponent> treeRoot = new TreeItem<>(rootTeam, new Circle(8, Color.ORANGE));	// 根节点
		treeRoot.setExpanded(true);
		tree.setRoot(treeRoot);
		
		// 按钮面板
		vBox.setLayoutX(400);
		vBox.setLayoutY(110);
		
		addTeamButton = new Button("增加团队");
		addPersonButton = new Button("增加个人");
		delNodeButton = new Button("删除节点");
		vBox.getChildren().addAll(addTeamButton, addPersonButton, delNodeButton);
		vBox.getChildren().forEach(new Consumer<Node>() {

			@Override
			public void accept(Node t) {
				Button button = (Button) t;
				button.setPrefSize(80, 40);
			}
		});
		root.getChildren().addAll(tree, vBox);	
		
		Scene scene = new Scene(root, 550, 450);
		stage.setScene(scene);
		stage.getIcons().add(new Image("cn/edu/scau/cmi/chenbingquan/image/窗口左上角图标.png"));
		stage.setTitle("一致组合模式");
		stage.setResizable(false);
		stage.show();
		
		// 事件
		// 增加个人
		addPersonButton.setOnMouseClicked(e -> addPerson() );
		
		// 增加团队
		addTeamButton.setOnMouseClicked(e -> addTeam() );
		
		// 删除节点
		delNodeButton.setOnMouseClicked(e -> deleteNode() );
	}
	
	// 增加个人
	public void addPerson() {
		TreeItem<ConsistentComponent> temp = tree.getSelectionModel().getSelectedItem();
		if(temp == null) {						// 没有选择节点
			showWrongStage("请先选择节点!!");
		} else if(temp.getValue().getClass() == ConsistentComposite.class) {		// 选择的是团队节点
			ConsistentComposite tempSC = (ConsistentComposite) temp.getValue();
			showAddStage(temp, tempSC, true);		// true表示选择的是个人节点
		} else {									// 选择的是个人节点
			showWrongStage("个人不能添加个人!!");
		}
	}
	
	// 增加团队
	public void addTeam() {
		TreeItem<ConsistentComponent> temp = tree.getSelectionModel().getSelectedItem();
		if(temp == null) {						// 没有选择节点
			showWrongStage("请先选择节点!!");
		} else if(temp.getValue().getClass() == ConsistentComposite.class) {		// 选择的是团队节点
			ConsistentComposite tempSC = (ConsistentComposite) temp.getValue();
			showAddStage(temp, tempSC, false);		// false表示选择的是团队节点
		} else {									// 选择的是个人节点
			showWrongStage("个人不能添加团队!!");
		}
	}
		
	// 显示添加窗口
	public void showAddStage(TreeItem<ConsistentComponent> temp, ConsistentComposite tempSC, Boolean isPerson) {
		
		Pane pane = new Pane();
		pane.setStyle("-fx-background-color: #44A08D");
					
		TextField tf = new TextField();
		tf.setFocusTraversable(false);
		tf.setPromptText("请输入名字");
		tf.setPrefHeight(40);
		tf.setLayoutX(70);
		tf.setLayoutY(50);
		
		Button button = new Button("确定");
		button.setPrefSize(60, 30);
		button.setLayoutX(120);
		button.setLayoutY(150);
		pane.getChildren().addAll(tf, button);
					
		Stage stage = new Stage();
		Scene scene = new Scene(pane, 300, 250);
		stage.setScene(scene);
		stage.show();
					
		// 事件
		// 点击按钮添加个人或团队
		button.setOnMouseClicked(e -> {
			if(tf.getText().equals("") ) {		// 没有输入名字时
				showWrongStage("请先输入名字!!");
			} else if(isNameExisted(tf.getText()) == true) {
				showWrongStage("该节点已经存在!!");
			} else {							// 输入名字后
				ConsistentComponent node;
				TreeItem<ConsistentComponent> treeItem;
				if(isPerson == true ) {
					node = new ConsistentLeaf(tf.getText());
					treeItem = new TreeItem<>(node, new Rectangle(15, 15, Color.RED) );		// 个人节点图形为红色正方形
				} else {
					node = new ConsistentComposite(tf.getText());
					treeItem = new TreeItem<>(node, new Circle(8, Color.GREEN) );	// 团队节点图形为绿色圆形
				}
				treeItem.setExpanded(true); 	// 设置展开节点
				temp.getChildren().add(treeItem);	// 树形视图增加节点
				tempSC.addChild(node);				// 团队的数组列表增加个人或子团队
				names.add(tf.getText());	// 记录名字
				stage.close();
			}
		}); 		
	}
	
	// 判断名字是否重复
	public boolean isNameExisted(String name) {
		for(int i=0; i<names.size(); i++) {
			if(names.get(i).equals(name) ) {
				return true;
			}
		}
		return false;
	}
	
	// 删除节点
	public void deleteNode() {
		TreeItem<ConsistentComponent> temp = tree.getSelectionModel().getSelectedItem();
		if(temp == null) {					// 没有选择节点时
			showWrongStage("请先选择节点!!");
		} else {		// 选择的是团队或个人节点
			if(temp.getParent() == null) {		// 如果删除的是根节点
				showWrongStage("根节点不能删除!!");
			} else {
				TreeItem<ConsistentComponent> tempParent = temp.getParent();		// 获取父节点
				ConsistentComposite sc = (ConsistentComposite) tempParent.getValue();	// 获取父团队
				sc.removeChild(temp.getValue());		// 删除在父节点中的记录
				tempParent.getChildren().remove(temp);		// 树形视图删除节点
				names.remove(temp.getValue().getName());		// 删除名字记录
			}
		} 
	}
	
	// 显示错误提示窗口
	public void showWrongStage(String message) {
					
		VBox vBox = new VBox(60);
		vBox.setAlignment(Pos.CENTER);
		vBox.setStyle("-fx-background-color: ANTIQUEWHITE");
					
		Text text = new Text(message);
		text.setStyle("-fx-font-size: 25; -fx-fill: orange"); 
					
		Button button = new Button("确定");
		button.setPrefSize(60, 30);
		vBox.getChildren().addAll(text, button);
					
		Stage stage = new Stage();
		Scene scene = new Scene(vBox, 300, 250);
		stage.setScene(scene);
		stage.show();
					
		// 事件
		button.setOnMouseClicked(e -> stage.close() ); 		// 关闭窗口
	}
}





